#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define THREAD_COUNT 20000  // 定义线程的数量为20000

// 初始化一个互斥锁
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

void *add_thread(void *argv)
{
    // 将接收的参数argv（一个void指针）转换为int指针，指向共享变量num
    int *p = (int *)argv;

    // 对共享资源加锁，防止多个线程同时操作num
    pthread_mutex_lock(&lock);

    // 对指向的内存区域的值进行加1操作，也就是给num加1
    *p = *p + 1;

    // 解锁，允许其他线程操作num
    pthread_mutex_unlock(&lock);

    return NULL;  // 线程结束时返回NULL
}

int main()
{
    pthread_t threads[THREAD_COUNT];  // 创建线程数组，用来保存每个线程的ID

    int num = 0;  // 被多个线程进行加1操作的共享变量

    // 启动20000个线程，让每个线程对num进行加1操作
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        // 创建线程，传入线程ID，线程属性为NULL，线程执行的函数是add_thread，传入num的地址作为参数
        pthread_create(&threads[i], NULL, add_thread, &num);
    }

    // 等待所有线程执行完毕，确保所有线程都已经对num进行了加1操作
    for (int i = 0; i < THREAD_COUNT; i++)
    {
        pthread_join(threads[i], NULL);  // 等待线程完成
    }

    // 打印累加结果，理论上num应该等于20000，但加锁之后应该避免了竞态条件
    printf("累加结果：%d \n", num);

    // 销毁锁，释放资源
    pthread_mutex_destroy(&lock);

    return 0;  // 程序结束
}

